package com.macro.mall.portal.service;

import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.OmsCartItem;
import com.macro.mall.model.OmsOrderItem;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.domain.*;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 前台订单管理Service
 * Created by macro on 2018/8/30.
 */
public interface OmsPortalOrderService {
    /**
     * 根据用户购物车信息生成确认单信息
     * @param cartIds
     */
    ConfirmOrderResult generateConfirmOrder(String cartIds);
    /**
     * 根据商品详情页生成确认订单信息
     * @author zhouboyu
     * @Date 2020年9月10日
     * @param skuId
     * @param quantity
     * @return
     */
    ConfirmOrderResult generateConfirmOrderOrderItemDetails(Long skuId,Integer quantity);

    /**
     * 根据提交信息生成订单
     */
    @Transactional
    Long generateOrder(OrderParam orderParam);

    /**
     * 商品详情页下单接口
     * @author zhouboyu
     * @Date 2020年9月9日
     *
     * @param orderParam
     * @return
     */
    @Transactional
    Long generateOrderItemDetails(OrderParam orderParam);

    /**
     * 通过skuId和数量组装购物车
     * @author zhouboyu
     * @Date 2020年9月10日
     * @param skuId
     * @param quantity
     * @param currentMember
     * @return
     */
    OmsCartItem getOmsCartItem(Long skuId, Integer quantity, UmsMember currentMember);

    /**
     * 支付成功后的回调
     */
    @Transactional
    Integer paySuccess(String orderSn, Integer payType);

    /**
     * 自动取消超时订单
     */
    @Transactional
    Integer cancelTimeOutOrder();

    /**
     * 取消单个超时订单
     */
    @Transactional
    void cancelOrder(Long orderId,String note,Boolean cancelWaitGroupBuy);

    /**
     * 发送延迟消息取消订单
     */
    void sendDelayMessageCancelOrder(Long orderId);

    /**
     * 确认收货
     */
    void confirmReceiveOrder(Long orderId);

    /**
     * 分页获取用户订单
     */
    Map<String, Object> list(Integer status, String productName, Integer pageNum, Integer pageSize,Integer type,Integer agentSendType, Long memberId);

    /**
     * 根据订单ID获取订单详情
     */
    OmsOrderDetail detail(Long orderId);

    /**
     * 用户根据订单ID删除订单
     */
    void deleteOrder(Long orderId);

    /**
     * 获取用户可用的优惠券
     * @author zhouboyu
     * @Date 2020年9月13日
     * @param memberId
     * @param orderParam
     */
    List<SmsCouponHistoryDetail>  getCouponList(Long memberId, OrderParam orderParam);

    /**
     * 经纪人处理代下单订单
     * @author zhouboyu
     * @Date 2020年9月14日
     * @param orderId
     * @return
     */
    Integer agentSend(Long orderId);

    /**
     * 微信付款
     * @author zhouboyu
     * @Date 2020年9月14日
     * @param type
     *          0->H5，1->小程序，2->IOS,3->Android
     * @param orderId
     */
    Map<String, String> wxPay(Long orderId,String ipAddress,Integer type) throws Exception;
    /**
     * 获取经纪人库存列表
     * @author 孙晓亮
     * @date 2020年9月21日
     * @param agentId 经纪人id
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<AgentSkuListResult> getAgentSkuList(Long agentId,Long productCategoryId, Integer pageNum, Integer pageSize);

    /**
     * 根据id获取子订单中的商品信息
     * @param id
     * @return
     */
    OrderItemDetail getProductFromOrderItem(Long id);


    /**
     * 解除订单商品库存锁定
     * 区分普通商品和组合商品
     * @param orderItemList
     */
    void releaseSkuStockLock(List<OmsOrderItem> orderItemList);
}
